##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5 ✓ purrr 0.3.4
## ✓ tibble 3.1.6 ✓ stringr 1.4.0
## ✓ tidyr 1.1.4 ✓ forcats 0.5.1
## ✓ readr 2.1.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
##
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
##
## chisq.test, fisher.test
##
## Attaching package: 'cowplot'
## The following object is masked from 'package:ggthemes':
##
## theme_map
## The following object is masked from 'package:patchwork':
##
## align_plots
## The following object is masked from 'package:lubridate':
##
## stamp
## Linking to ImageMagick 6.9.12.3
## Enabled features: cairo, fontconfig, freetype, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fftw, ghostscript, x11
## Rows: 319795 Columns: 18
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (14): HeartDisease, Smoking, AlcoholDrinking, Stroke, DiffWalking, Sex, ...
## dbl (4): BMI, PhysicalHealth, MentalHealth, SleepTime
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Introduction and background
Heart disease is one of the leading causes of death for most Americans, regardless of race (CDC). Around 47% of Americans have at least 1 out of 3 major risk factors for heart disease, which are: high cholesterol, high blood pressure, and smoking. Obesity (High BMI), diabetes, physical activity levels, and alcohol consumption are also considered as key indicators. Identifying the factors that have the most influence on heart disease prevalence is important in order to act on them earlier. By looking at data from the CDC, we aim to detect patterns that could potentially help predict a patient’s predisposition to heart disease. Our group chose to focus our research on those main factors: BMI, Race, Sex, Age, and living habbits.
Data Collection
Originally, the dataset comes from the CDC and is a major part of the Behavioral Risk Factor Surveillance System (BRFSS), which conducts annual telephone surveys to gather data on the health status of U.S. residents. As the CDC describes: “Established in 1984 with 15 states, BRFSS now collects data in all 50 states as well as the District of Columbia and three U.S. territories. BRFSS completes more than 400,000 adult interviews each year, making it the largest continuously conducted health survey system in the world.”. The most recent dataset (as of February 15, 2022) includes data from 2020. It consists of 401,958 rows and 279 columns. The vast majority of columns are questions asked to respondents about their health status, such as “Do you have serious difficulty walking or climbing stairs?” or “Have you smoked at least 100 cigarettes in your entire life? [Note: 5 packs = 100 cigarettes]”. In this dataset, I noticed many different factors (questions) that directly or indirectly influence heart disease, so I decided to select the most relevant variables from it and do some cleaning so that it would be usable for machine learning projects. 2020 annual CDC survey data of 400k adults related to their health status.
Analysis
DEMOGRAPHICS OF SAMPLES
I.Number of subjects according to sex
| Sex |
n |
Percentage |
| Female |
167805 |
52.47268 |
| Male |
151990 |
47.52732 |
II.Number of Sample according to Race
| Race |
n |
Percentage |
| American Indian/Alaskan Native |
5202 |
1.626667 |
| Asian |
8068 |
2.522866 |
| Black |
22939 |
7.173033 |
| Hispanic |
27446 |
8.582373 |
| Other |
10928 |
3.417189 |
| White |
245212 |
76.677872 |
DEMOGRAPHICS & HEART DISEASE PREVALENCE
I.Race and Heart Disease
## List of 2
## $ axis.title.y: list()
## ..- attr(*, "class")= chr [1:2] "element_blank" "element"
## $ axis.text.x :List of 11
## ..$ family : NULL
## ..$ face : NULL
## ..$ colour : NULL
## ..$ size : num 6.5
## ..$ hjust : NULL
## ..$ vjust : NULL
## ..$ angle : NULL
## ..$ lineheight : NULL
## ..$ margin : NULL
## ..$ debug : NULL
## ..$ inherit.blank: logi FALSE
## ..- attr(*, "class")= chr [1:2] "element_text" "element"
## - attr(*, "class")= chr [1:2] "theme" "gg"
## - attr(*, "complete")= logi FALSE
## - attr(*, "validate")= logi TRUE
II.Age Groups and Heart Disease

III.BMI and Heart Disease A.Classification of Weight Status by Body Mass Index (BMI) 1.Use argument to make each BMI category: Underweight = <18.5 Normal wright = 18.5-24.9 Overweight = 25-29.9 Obesity Class I = 30-34.9 Obesity Class 2 = 35-35.9 Extreme Obesity = >40
As can be seen from the graph, if the race and sex groups are not seperated to be considered, subjects with heart disease have slightly higher BMI than subjects without heart disease, in which case higher BMI suggeting more possibility of overweight.
We have to reveal that, in this dataset, there is an unequal distribution of BMI as the largest portion of subjects have the BMI categorized as overweight class. Thus, it’s not justifiable to conclude that overweight subjects have a lower rate of getting heart disease based on this graph, as the same with normal class and obesity class I.
2.The BMI average of race groups, in disparison of sex
## `summarise()` has grouped output by 'Race', 'HeartDisease'. You can override
## using the `.groups` argument.

IV.Heart Disease and habits
A. Sleep time
## Warning: Removed 659 rows containing non-finite values (stat_density).

B. Alcohol Drinking and Smoking 
V. Calculator of People With Heart Disease According To Factors
here
##Conclusion
LS0tCnRpdGxlOiAiSW1wYWN0b3JzIG9mIEhlYXJ0IERpc2Vhc2UiCmF1dGhvcjogIk1hcmNlbGEsIFhpbnlpLCBQaWEiCmRhdGU6ICI0LzI2LzIwMjIiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdGhlbWU6IGNlcnVsZWFuCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UpCmBgYAoKYGBge3IsZWNobz1GQUxTRX0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnYW5pbWF0ZSkKbGlicmFyeShndCkKbGlicmFyeShsdWJyaWRhdGUpICAgICAKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZ2d0aGVtZXMpICAgICAgCmxpYnJhcnkoamFuaXRvcikgICAgICAgCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShjb3dwbG90KQpsaWJyYXJ5KG1hZ2ljaykKbGlicmFyeShrbml0cikKdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoKSkgCmBgYAoKYGBge3J9CmhlYXJ0PC1yZWFkX2NzdigiaGVhcnRfMjAyMF9jbGVhbmVkLmNzdiIpCmBgYAoKIyMgSW50cm9kdWN0aW9uIGFuZCBiYWNrZ3JvdW5kCgpIZWFydCBkaXNlYXNlIGlzIG9uZSBvZiB0aGUgbGVhZGluZyBjYXVzZXMgb2YgZGVhdGggZm9yIG1vc3QgQW1lcmljYW5zLCByZWdhcmRsZXNzIG9mIHJhY2UgKENEQykuIEFyb3VuZCA0NyUgb2YgQW1lcmljYW5zIGhhdmUgYXQgbGVhc3QgMSBvdXQgb2YgMyBtYWpvciByaXNrIGZhY3RvcnMgZm9yIGhlYXJ0IGRpc2Vhc2UsIHdoaWNoIGFyZTogaGlnaCBjaG9sZXN0ZXJvbCwgaGlnaCBibG9vZCBwcmVzc3VyZSwgYW5kIHNtb2tpbmcuIE9iZXNpdHkgKEhpZ2ggQk1JKSwgZGlhYmV0ZXMsIHBoeXNpY2FsIGFjdGl2aXR5IGxldmVscywgYW5kIGFsY29ob2wgY29uc3VtcHRpb24gYXJlIGFsc28gY29uc2lkZXJlZCBhcyBrZXkgaW5kaWNhdG9ycy4gSWRlbnRpZnlpbmcgdGhlIGZhY3RvcnMgdGhhdCBoYXZlIHRoZSBtb3N0IGluZmx1ZW5jZSBvbiBoZWFydCBkaXNlYXNlIHByZXZhbGVuY2UgaXMgaW1wb3J0YW50IGluIG9yZGVyIHRvIGFjdCBvbiB0aGVtIGVhcmxpZXIuIEJ5IGxvb2tpbmcgYXQgZGF0YSBmcm9tIHRoZSBDREMsIHdlIGFpbSB0byBkZXRlY3QgcGF0dGVybnMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBoZWxwIHByZWRpY3QgYSBwYXRpZW504oCZcyBwcmVkaXNwb3NpdGlvbiB0byBoZWFydCBkaXNlYXNlLiAKT3VyIGdyb3VwIGNob3NlIHRvIGZvY3VzIG91ciByZXNlYXJjaCBvbiB0aG9zZSBtYWluIGZhY3RvcnM6IEJNSSwgUmFjZSwgU2V4LCBBZ2UsIGFuZCBsaXZpbmcgaGFiYml0cy4gCgoKIyMgRGF0YSBDb2xsZWN0aW9uCgpPcmlnaW5hbGx5LCB0aGUgZGF0YXNldCBjb21lcyBmcm9tIHRoZSBDREMgYW5kIGlzIGEgbWFqb3IgcGFydCBvZiB0aGUgQmVoYXZpb3JhbCBSaXNrIEZhY3RvciBTdXJ2ZWlsbGFuY2UgU3lzdGVtIChCUkZTUyksIHdoaWNoIGNvbmR1Y3RzIGFubnVhbCB0ZWxlcGhvbmUgc3VydmV5cyB0byBnYXRoZXIgZGF0YSBvbiB0aGUgaGVhbHRoIHN0YXR1cyBvZiBVLlMuIHJlc2lkZW50cy4gQXMgdGhlIENEQyBkZXNjcmliZXM6ICJFc3RhYmxpc2hlZCBpbiAxOTg0IHdpdGggMTUgc3RhdGVzLCBCUkZTUyBub3cgY29sbGVjdHMgZGF0YSBpbiBhbGwgNTAgc3RhdGVzIGFzIHdlbGwgYXMgdGhlIERpc3RyaWN0IG9mIENvbHVtYmlhIGFuZCB0aHJlZSBVLlMuIHRlcnJpdG9yaWVzLiBCUkZTUyBjb21wbGV0ZXMgbW9yZSB0aGFuIDQwMCwwMDAgYWR1bHQgaW50ZXJ2aWV3cyBlYWNoIHllYXIsIG1ha2luZyBpdCB0aGUgbGFyZ2VzdCBjb250aW51b3VzbHkgY29uZHVjdGVkIGhlYWx0aCBzdXJ2ZXkgc3lzdGVtIGluIHRoZSB3b3JsZC4iLiBUaGUgbW9zdCByZWNlbnQgZGF0YXNldCAoYXMgb2YgRmVicnVhcnkgMTUsIDIwMjIpIGluY2x1ZGVzIGRhdGEgZnJvbSAyMDIwLiBJdCBjb25zaXN0cyBvZiA0MDEsOTU4IHJvd3MgYW5kIDI3OSBjb2x1bW5zLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBjb2x1bW5zIGFyZSBxdWVzdGlvbnMgYXNrZWQgdG8gcmVzcG9uZGVudHMgYWJvdXQgdGhlaXIgaGVhbHRoIHN0YXR1cywgc3VjaCBhcyAiRG8geW91IGhhdmUgc2VyaW91cyBkaWZmaWN1bHR5IHdhbGtpbmcgb3IgY2xpbWJpbmcgc3RhaXJzPyIgb3IgIkhhdmUgeW91IHNtb2tlZCBhdCBsZWFzdCAxMDAgY2lnYXJldHRlcyBpbiB5b3VyIGVudGlyZSBsaWZlPyBbTm90ZTogNSBwYWNrcyA9IDEwMCBjaWdhcmV0dGVzXSIuIEluIHRoaXMgZGF0YXNldCwgSSBub3RpY2VkIG1hbnkgZGlmZmVyZW50IGZhY3RvcnMgKHF1ZXN0aW9ucykgdGhhdCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZmx1ZW5jZSBoZWFydCBkaXNlYXNlLCBzbyBJIGRlY2lkZWQgdG8gc2VsZWN0IHRoZSBtb3N0IHJlbGV2YW50IHZhcmlhYmxlcyBmcm9tIGl0IGFuZCBkbyBzb21lIGNsZWFuaW5nIHNvIHRoYXQgaXQgd291bGQgYmUgdXNhYmxlIGZvciBtYWNoaW5lIGxlYXJuaW5nIHByb2plY3RzLiAyMDIwIGFubnVhbCBDREMgc3VydmV5IGRhdGEgb2YgNDAwayBhZHVsdHMgcmVsYXRlZCB0byB0aGVpciBoZWFsdGggc3RhdHVzLgoKCiMjIEFuYWx5c2lzCgojIERFTU9HUkFQSElDUyBPRiBTQU1QTEVTCgpJLk51bWJlciBvZiBzdWJqZWN0cyBhY2NvcmRpbmcgdG8gc2V4CgpgYGB7cixlY2hvPUZBTFNFfQpoZWFydDEgPC0gaGVhcnQgJT4lIAogIGNvdW50KFNleCkgJT4lIAogIG11dGF0ZShQZXJjZW50YWdlID0gMTAwKihuL3N1bShuKSkpCgpoZWFydF9ndCA8LSBoZWFydDEgJT4lIAogIGd0KHJvd25hbWVfY29sID0gInJvdyIsCiAgICBncm91cG5hbWVfY29sID0gImdyb3VwIikgJT4lIAogIHRhYl9vcHRpb25zKGNvbHVtbl9sYWJlbHMuYmFja2dyb3VuZC5jb2xvciA9ICJsaWdodGJsdWUiKSAlPiUgCiAgIHRhYl9oZWFkZXIoCiAgICB0aXRsZSA9ICJTZXggb2YgU2FtcGxlIGZyb20gRGF0YXNldCIsCiAgICBzdWJ0aXRsZSA9IG1kKCIiKQogICkgCgpoZWFydF9ndApgYGAKCgpJSS5OdW1iZXIgb2YgU2FtcGxlIGFjY29yZGluZyB0byBSYWNlCgpgYGB7cixlY2hvPUZBTFNFfQpyYWNlIDwtIGhlYXJ0ICU+JSAKICBjb3VudChSYWNlKSAlPiUgCiAgbXV0YXRlKFBlcmNlbnRhZ2UgPSAxMDAqKG4vc3VtKG4pKSkKCnJhY2VfZ3QgPC0gcmFjZSAlPiUgCiAgZ3Qocm93bmFtZV9jb2wgPSAicm93IiwKICAgIGdyb3VwbmFtZV9jb2wgPSAiZ3JvdXAiKSAlPiUgCiAgdGFiX29wdGlvbnMoY29sdW1uX2xhYmVscy5iYWNrZ3JvdW5kLmNvbG9yID0gImxpZ2h0cGluayIpICU+JSAKICAgdGFiX2hlYWRlcigKICAgIHRpdGxlID0gIlJhY2Ugb2YgU2FtcGxlIGZyb20gRGF0YXNldCIsCiAgICBzdWJ0aXRsZSA9IG1kKCIiKQogICkgCgpyYWNlX2d0CmBgYAoKCiMgREVNT0dSQVBISUNTICYgSEVBUlQgRElTRUFTRSBQUkVWQUxFTkNFCgpJLlJhY2UgYW5kIEhlYXJ0IERpc2Vhc2UKCmBgYHtyLGVjaG89RkFMU0V9CnJhY2VfcHJldmFsZW5jZSA8LSBoZWFydCAlPiUgCiAgZ3JvdXBfYnkoUmFjZSkgJT4lIAogIGNvdW50KEhlYXJ0RGlzZWFzZSkgJT4lIAogIGdncGxvdChhZXMoeCA9IFJhY2UsCiAgICAgICAgICAgICB5ID0gbiwgCiAgICAgICAgICAgICBmaWxsID0gSGVhcnREaXNlYXNlKSwgcG9zaXRpb24gPSAic3RhY2siKSArCiAgZ2VvbV9jb2woKSArCiAgbGFicyh0aXRsZSA9ICJIZWFydCBEaXNlYXNlIFByZXZhbGVuY2UgYnkgUmFjZSIpCiAgdGhlbWUoYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2LjUpKQogIApnZ3Bsb3RseShyYWNlX3ByZXZhbGVuY2UpCmBgYAoKSUkuQWdlIEdyb3VwcyBhbmQgSGVhcnQgRGlzZWFzZQoKYGBge3IsZWNobz1GQUxTRX0KaGVhcnQgJT4lIAogIGZpbHRlcihIZWFydERpc2Vhc2U9PSJZZXMiKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUFnZUNhdGVnb3J5LGZpbGw9QWdlQ2F0ZWdvcnkpKSsKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC40KSsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoYW5nbGU9NDUpLHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlPSJib2xkIixjb2xvcj0iYmxhY2siLGhqdXN0PTAuNSkpKwogIGxhYnModGl0bGU9IkFnZSBncm91cHMgYW5kIGhlYXJ0IGRpc2Vhc2UiLHk9InByb3BvcnRpb24gb2YgcG9wdWxhdGlvbiB3aXRoIGhlYXJ0IGRpc2Vhc2UiLHg9IiIpCmBgYAoKSUlJLkJNSSBhbmQgSGVhcnQgRGlzZWFzZQpBLkNsYXNzaWZpY2F0aW9uIG9mIFdlaWdodCBTdGF0dXMgYnkgQm9keSBNYXNzIEluZGV4IChCTUkpCjEuVXNlIGFyZ3VtZW50IHRvIG1ha2UgZWFjaCBCTUkgY2F0ZWdvcnk6CiAgVW5kZXJ3ZWlnaHQgPSA8MTguNQogIE5vcm1hbCB3cmlnaHQgPSAxOC41LTI0LjkKICBPdmVyd2VpZ2h0ID0gMjUtMjkuOQogIE9iZXNpdHkgQ2xhc3MgSSA9IDMwLTM0LjkKICBPYmVzaXR5IENsYXNzIDIgPSAzNS0zNS45CiAgRXh0cmVtZSBPYmVzaXR5ID0gPjQwCgpgYGB7cixlY2hvPUZBTFNFfQpibWlfZ3JvdXBzIDwtIGhlYXJ0ICU+JSAKICBtdXRhdGUoYm1pX2dyb3VwPWNhc2Vfd2hlbihCTUk8MTguNX4iVW5kZXJ3ZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgQk1JPj0xOC41ICYgQk1JPD0yNC45fiJOb3JtYWwgV2VpZ2h0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIEJNST49MjUgJiBCTUk8PTI5Ljl+Ik92ZXJ3ZWlnaHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgQk1JPj0zMCAmIEJNSTw9MzQuOX4iT2Jlc2l0eSBDbGFzcyBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgIEJNST49MzUgJiBCTUk8PTM1Ljl+Ik9iZXNpdHkgQ2xhc3MgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgQk1JPj0zNn4iRXh0cmVtZSBPYmVzaXR5IikpCmhlYXJ0ICU+JSAKICBmaWx0ZXIoQk1JPDUwKSAlPiUgCiAgZ2dwbG90KGFlcyh4PUhlYXJ0RGlzZWFzZSx5PUJNSSkpKwogIGdlb21fYm94cGxvdChub3RjaCA9IFRSVUUsZmlsbCA9ICJjb3JuZmxvd2VyYmx1ZSIsIAogICAgICAgICAgICAgICBhbHBoYSA9IC43KSsKICBsYWJzKHRpdGxlPSJCTUkgYXZlcmFnZSBvZiBncm91cHMgd2l0aCBhbmQgd2l0aG91dCBIZWFydCBEaXNlYXNlIikrCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUsZmFjZT0iYm9sZCIpKQpgYGAKQXMgY2FuIGJlIHNlZW4gZnJvbSB0aGUgZ3JhcGgsIGlmIHRoZSByYWNlIGFuZCBzZXggZ3JvdXBzIGFyZSBub3Qgc2VwZXJhdGVkIHRvIGJlIGNvbnNpZGVyZWQsIHN1YmplY3RzIHdpdGggaGVhcnQgZGlzZWFzZSBoYXZlIHNsaWdodGx5IGhpZ2hlciBCTUkgdGhhbiBzdWJqZWN0cyB3aXRob3V0IGhlYXJ0IGRpc2Vhc2UsIGluIHdoaWNoIGNhc2UgaGlnaGVyIEJNSSBzdWdnZXRpbmcgbW9yZSBwb3NzaWJpbGl0eSBvZiBvdmVyd2VpZ2h0LgoKYGBge3J9CmJtaV9ncm91cHMgJT4lIAogIGZpbHRlcihpcy5uYShibWlfZ3JvdXApPT1GQUxTRSkgJT4lIAogIGdncGxvdChhZXMoeD1IZWFydERpc2Vhc2UseT1ibWlfZ3JvdXAsZmlsbD1ibWlfZ3JvdXApKSsKICBnZW9tX2NvbCgpKwogIGxhYnModGl0bGU9IkJNSSBncm91cHMgd2l0aCBhbmQgd2l0aG91dCBIZWFydCBEaXNlYXNlIiwKICAgICAgIHk9IiIpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsCiAgICAgICAgYXhpcy50ZXh0Lnk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MueT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdD0wLjUsZmFjZT0iYm9sZCIpKSsKICBmYWNldF93cmFwKHZhcnMoYm1pX2dyb3VwKSkKYGBgCldlIGhhdmUgdG8gcmV2ZWFsIHRoYXQsIGluIHRoaXMgZGF0YXNldCwgdGhlcmUgaXMgYW4gdW5lcXVhbCBkaXN0cmlidXRpb24gb2YgQk1JIGFzIHRoZSBsYXJnZXN0IHBvcnRpb24gb2Ygc3ViamVjdHMgaGF2ZSB0aGUgQk1JIGNhdGVnb3JpemVkIGFzIG92ZXJ3ZWlnaHQgY2xhc3MuIFRodXMsIGl04oCZcyBub3QganVzdGlmaWFibGUgdG8gY29uY2x1ZGUgdGhhdCBvdmVyd2VpZ2h0IHN1YmplY3RzIGhhdmUgYSBsb3dlciByYXRlIG9mIGdldHRpbmcgaGVhcnQgZGlzZWFzZSBiYXNlZCBvbiB0aGlzIGdyYXBoLCBhcyB0aGUgc2FtZSB3aXRoIG5vcm1hbCBjbGFzcyBhbmQgb2Jlc2l0eSBjbGFzcyBJLgoKCjIuVGhlIEJNSSBhdmVyYWdlIG9mIHJhY2UgZ3JvdXBzLCBpbiBkaXNwYXJpc29uIG9mIHNleAoKYGBge3IsZWNobz1GQUxTRX0KYm1pX2dyb3VwcyAlPiUgCiAgZ3JvdXBfYnkoUmFjZSxIZWFydERpc2Vhc2UsU2V4KSAlPiUgCiAgc3VtbWFyaXNlKG1lYW5fYm1pPW1lYW4oQk1JKSkgJT4lIAogIGdncGxvdChhZXMoeD1IZWFydERpc2Vhc2UseT1tZWFuX2JtaSxmaWxsPVNleCkpKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLHBvc2l0aW9uPSJkb2RnZSIpKwogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtZWFuX2JtaSwyKSkscG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSguOSksIHZqdXN0ID0gMS41LCBjb2xvdXIgPSAid2hpdGUiLCBzaXplID0gMikrCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hKSsKICBmYWNldF93cmFwKHZhcnMoUmFjZSkpKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoImRhcmtzbGF0ZWJsdWUiLCJkZWVwc2t5Ymx1ZTMiKSkrCiAgbGFicyh0aXRsZT0iQk1JIGF2ZXJhZ2Ugb2Ygc2V4IGFuZCByYWNlIGdyb3VwcyB3aXRoIGFuZCB3aXRob3V0IEhlYXJ0IERpc2Vhc2UiLAogICAgICAgeT0iQXZlcmFnZSBCTUkiKQpgYGAKCklWLkhlYXJ0IERpc2Vhc2UgYW5kIGhhYml0cwoKQS4gU2xlZXAgdGltZQpgYGB7cixlY2hvPUZBTFNFfQpibWlfZ3JvdXBzICU+JSAKICBnZ3Bsb3QoYWVzKHg9U2xlZXBUaW1lLGZpbGw9SGVhcnREaXNlYXNlKSkrCiAgeGxpbSgwLDE0KSsKICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUpKyAKICBsYWJzKHRpdGxlPSJIZWFydCBEaXNlYXNlIFByb2JhYmlsaXR5IGNvcnJlbGF0ZWQgdG8gYXZlcmFnZSBzbGVlcCB0aW1lIiwKICAgICAgIHk9IlByb2JhYmlsaXR5IG9mIGhlYXJ0IGRpc2Vhc2UiKSsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2U9ImJvbGQiLGNvbG9yPSJibGFjayIsaGp1c3Q9MC41KSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgoKQi4gQWxjb2hvbCBEcmlua2luZyBhbmQgU21va2luZwpgYGB7cixlY2hvPUZBTFNFfQpkcmlua2luZzwtYm1pX2dyb3VwcyAlPiUgCiAgZ2dwbG90KGFlcyh4PUFsY29ob2xEcmlua2luZyx5PUhlYXJ0RGlzZWFzZSxmaWxsPUFsY29ob2xEcmlua2luZykpKwogIGdlb21fY29sKCkrCiAgZmFjZXRfd3JhcCh2YXJzKEhlYXJ0RGlzZWFzZSkpCgpzbW9raW5nPC1ibWlfZ3JvdXBzICU+JSAKICBnZ3Bsb3QoYWVzKHg9U21va2luZyx5PUhlYXJ0RGlzZWFzZSxmaWxsPVNtb2tpbmcpKSsKICBnZW9tX2NvbCgpKwogIGZhY2V0X3dyYXAodmFycyhIZWFydERpc2Vhc2UpKQoKZHJpbmtpbmcrc21va2luZwpgYGAKClYuIENhbGN1bGF0b3Igb2YgUGVvcGxlIFdpdGggSGVhcnQgRGlzZWFzZSBBY2NvcmRpbmcgVG8gRmFjdG9ycwoKW2hlcmVdKGh0dHBzOi8vbWFyY2VsYXNhYXZlZHJhLnNoaW55YXBwcy5pby9IZWFydF9EaXNlYXNlX1ByZXZhbGVuY2UvKQoKIyNDb25jbHVzaW9uCgo=